{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "2e843a29ac1d8d6d",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "# 宏观经济数据\n",
    "\n",
    "宏观经济数据是指对全球经济的总体情况、经济运行的总体趋势、经济政策的制定、经济发展的总体规律、以及经济活动的各个方面进行的研究。宏观经济数据可以帮助我们了解经济的发展趋势、经济结构的演变、经济发展的总体规律、以及经济活动的各个方面。\n",
    "在银行业风险管理实务中，宏观经济数据是非常重要的，无论是基于监管要求的风险管理，还是基于商业利益的风险管理，宏观经济数据都是必不可少的工作。在全面风险管理与资本管理领域，宏观经济分析是压力测试工作的基础，在预期信用损失法（ECL）计算中，宏观经济分析是前瞻性模型的基础。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "233d0b2a16cdfdc",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "## 宏观经济数据来源\n",
    "\n",
    "宏观经济数据来源存在多种方式，常见的有以下几种：\n",
    "1. 政府官网：通过国家统计局管理的[国家数据](https://data.stats.gov.cn)网站、[财政部](https://www.mof.gov.cn/index.htm)等政府网站获取。\n",
    "2. 财经类网站：部分财经网站也可以提供一站式的宏观经济数据查询服务，如[Wind资讯](https://www.wind.com.cn/)、[东方财富网](http://data.eastmoney.com/)、[新浪财经](https://finance.sina.com.cn/mac)等。\n",
    "3. 数据服务商：一些专业的数据服务商提供宏观经济数据的查询和下载服务，一般可以购买该类厂商的数据服务，厂商提供数据接口供Python、R、Excel等软件直接调用，如Wind、同花顺、Choice等。\n",
    "4. 开源数据接口：一些开源数据项目也提供宏观经济数据的查询和下载服务，如[AkShare](https://akshare.akfamily.xyz/introduction.html)、[TuShare](https://tushare.pro/)等。\n",
    "\n",
    "以上数据源比较结果如下：\n",
    "\n",
    "|   数据来源   | 来源类型    | 数据权威性 | 数据格式     | 是否收费          | 说明                                                                                  |\n",
    "|:--------:|:-------:|:------:|:------:|:----------:|:----------:|----------|\n",
    "|   政府官网   | 第一来源    | 最高    | 网页/Excel | 否             | 数据权威，分布较广，要手动下载，一般作为数据复核用                                                           |\n",
    "|  财经类网站   | 第二来源    | 较高    | 网页       | 否             | 取决于网站收集的维度，多数网站提供的宏观经济数据较为全面，用于查询较为方便，若需要做分析，则需要手动下载数据或根据网站情况、购买数据服务，适合个人研究或简单查询使用 |\n",
    "|  数据服务商   | 第二来源    | 较高    | 接口       | 是（根据厂商收费情况）   | 通常为财经类网站的数据接口，提供数据查询和下载服务，数据质量较高，覆盖范围广泛，但通常需要付费购买数据服务，适合机构研究                               |\n",
    "|  开源数据接口  | 第二、三来源  | 有待复核  | 接口       | 否（根据开源项目收费情况） | 研究所或团队开发的开源数据接口，底层依赖通常是政府官网或财经类网站的数据，数据质量有待考量，覆盖范围取决于项目的开发者，收费情况也不统一，适合个人研究或小型项目使用。 |\n",
    "\n",
    "以上不同的数据来源数据更新频率、数据质量、数据覆盖范围、数据格式、是否收费等方面存在较大的差异，手动下载的数据源也可以通过Python爬虫技术进行数据批量下载，但需要注意使用目的及爬虫的合规性，在具体使用时需要根据具体需求选择合适的数据来源。\n",
    "\n",
    "本文将介绍如何使用Python获取宏观经济数据，主要介绍WIND资讯的数据接口。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a852ceae5941c7",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "### Wind资讯数据接口\n",
    "在金融财经数据领域，Wind是国内完整准确、以金融证券数据为核心的大型金融工程和财经数据仓库。Wind的数据内容涵盖股票、债券、基金、外汇、金融衍生品、大宗商品、宏观经济、财经新闻等领域；同时Wind开发了一系列围绕信息检索、数据提取与分析、投资组合管理应用等领域的专业分析软件与应用工具，对于使用Python进行宏观经济数据分析有如下优点：\n",
    "* 接口简单易用\n",
    "* 数据更新及时\n",
    "* 数据质量高\n",
    "* 数据覆盖范围广泛\n",
    "\n",
    "对于Wind的接口的完整使用，请参考Wind的官方手册，本文简单介绍如何使用Wind的Python接口获取宏观经济数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "source": [
    "#### Python接口（WindPy）的安装\n",
    "打开Wind金融终端，以此点击“开始”——“插件修复”——“修复Python接口”，界面如下。弹出接口修复界面后按相关说明进行操作即可。\n",
    "<img src=\"media/wind界面：Python接口修复.png\" alt=\"Wind修复Python接口\" width=\"600\">\n",
    "\n",
    "修复完成后，在Wind金融终端中输入`import WindPy`命令，如果没有报错，则表示安装成功。"
   ],
   "metadata": {
    "collapsed": false
   },
   "id": "6fa2e4801da3f121"
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "de293656b7737aae",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-07-16T04:11:07.663398Z",
     "start_time": "2025-07-16T04:11:03.970516Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Welcome to use Wind Quant API for Python (WindPy)!\n",
      "\n",
      "COPYRIGHT (C) 2024 WIND INFORMATION CO., LTD. ALL RIGHTS RESERVED.\n",
      "IN NO CIRCUMSTANCE SHALL WIND BE RESPONSIBLE FOR ANY DAMAGES OR LOSSES CAUSED BY USING WIND QUANT API FOR Python.\n"
     ]
    }
   ],
   "source": [
    "try:    \n",
    "    from WindPy import w\n",
    "    w.start()\n",
    "except:\n",
    "    print(\"WindPy模块未安装，请先安装WindPy模块。\")\n",
    "    print(\"请参考WindPy模块的安装说明：https://www.wind.com.cn/zh-cn/solutions/windpy/\")\n",
    "    pass"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c035b77b99d95fd6",
   "metadata": {
    "collapsed": false
   },
   "source": [
    "#### Wind的Python代码\n",
    "\n",
    "Wind的Python代码使用非常简单，主要通过`w`对象来调用接口。以下是一些常用的接口示例：\n",
    "在不知道如何使用Python调用Wind接口时，可以通过Wind的代码生成器帮忙生成代码，具体操作如下：\n",
    "\n",
    "**Wind代码生成器入口**\n",
    "\n",
    "\n",
    "<img src=\"media/wind界面：代码生成器入口.png\" alt=\"Wind代码生成器\" width=\"300\">\n",
    "\n",
    "\n",
    "**Wind代码生成器**\n",
    "\n",
    "\n",
    "<img src=\"media/wind代码生成器.png\" alt=\"Wind代码生成器\" width=\"600\">"
   ]
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "2025-07-16\n"
     ]
    }
   ],
   "source": [
    "import pandas as pd\n",
    "TODAY = pd.Timestamp.today().strftime('%Y-%m-%d')\n",
    "\n",
    "print(TODAY)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-07-16T04:13:07.641979Z",
     "start_time": "2025-07-16T04:13:05.186184Z"
    }
   },
   "id": "2c626e6b4f4c8a60",
   "execution_count": 2
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "12449e15784ff889",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-07-16T04:13:38.557573Z",
     "start_time": "2025-07-16T04:13:38.544110Z"
    }
   },
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "TODAY = pd.Timestamp.today().strftime('%Y-%m-%d')\n",
    "\n",
    "def get_edb_wind(list_code: list[str], date_start: str = '2000-01-01', date_end: str = TODAY) -> pd.DataFrame:\n",
    "    \"\"\"\n",
    "    获取Wind EDB数据\n",
    "\n",
    "    params\n",
    "    ------\n",
    "    list_code: list[str]\n",
    "        万德宏观指标代码列表\n",
    "    date_start: str = '2000-01-01'\n",
    "        开始日期，默认值为2000-01-01，格式：YYYY-MM-DD\n",
    "    date_end: str = TODAY\n",
    "        结束日期，默认值为当天日期，格式：YYYY-MM-DD\n",
    "\n",
    "    return\n",
    "    ------\n",
    "    pd.DataFrame\n",
    "        宏观经济数据集\n",
    "    \"\"\"\n",
    "    edb = w.edb(','.join(list_code), date_start, date_end)\n",
    "    if edb.ErrorCode == 0:\n",
    "        data = pd.DataFrame(edb.Data, index=edb.Codes, columns=edb.Times).T\n",
    "        data.index = data.index.astype(str)\n",
    "        return data\n",
    "    else:\n",
    "        return pd.DataFrame()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "71491e9725ae4a22",
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-07-16T05:03:09.533087Z",
     "start_time": "2025-07-16T05:03:09.105831Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['S2707411', 'S2700453', 'S0073300', 'M0009970', 'M0041340', 'M0012990', 'M0012303', 'M0012304', 'M0024063', 'M0000541', 'M0039354', 'M5650805', 'M5525763', 'M5525764', 'M0001385', 'M0001383', 'M0000610', 'M0000611', 'M0000609', 'M0000607', 'M0001428', 'M0000273', 'M0001227', 'M0000612', 'M0000545']\n"
     ]
    }
   ],
   "source": [
    "data_vars = pd.read_excel(\"E:\\Psbc\\新逻辑\\压测\\宏观经济数据下载.xlsx\", sheet_name=\"指标清单\")\n",
    "list_vars = data_vars['指标ID'].tolist()\n",
    "print(list_vars)"
   ]
  },
  {
   "cell_type": "code",
   "outputs": [],
   "source": [
    "data = get_edb_wind(list_vars)"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-07-16T05:03:50.275080Z",
     "start_time": "2025-07-16T05:03:49.893862Z"
    }
   },
   "id": "22b7294e8cf7fc26",
   "execution_count": 6
  },
  {
   "cell_type": "code",
   "outputs": [],
   "source": [
    "data.to_clipboard()"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-07-16T05:04:23.932979Z",
     "start_time": "2025-07-16T05:04:23.841380Z"
    }
   },
   "id": "5c96b3fb54f62182",
   "execution_count": 8
  },
  {
   "cell_type": "code",
   "outputs": [],
   "source": [
    "list_code = 'M0000612, M0000545'\n",
    "\n",
    "edb = w.edb(list_code, '2024-01-01', '2025-06-30')"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-07-16T05:12:35.549305Z",
     "start_time": "2025-07-16T05:12:35.417986Z"
    }
   },
   "id": "ec96097c12a1b766",
   "execution_count": 13
  },
  {
   "cell_type": "code",
   "outputs": [
    {
     "data": {
      "text/plain": ".ErrorCode=0\n.Codes=[M0000612,M0000545]\n.Fields=[CLOSE]\n.Times=[20240131,20240229,20240331,20240430,20240531,20240630,20240731,20240831,20240930,20241031,...]\n.Data=[[-0.8,0.7,0.1,0.3,0.3,0.2,0.5,0.6,0.4,0.3,...],[26.3,-12.7,4.5,6.7,5.6,5.3,5.1,4.5,5.4,5.3,...]]"
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "edb"
   ],
   "metadata": {
    "collapsed": false,
    "ExecuteTime": {
     "end_time": "2025-07-16T05:12:38.412508Z",
     "start_time": "2025-07-16T05:12:38.403918Z"
    }
   },
   "id": "a4f7fb0ad94de619",
   "execution_count": 14
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.11.9"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
